home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-9.10-netbook-remix-PL.iso / casper / filesystem.squashfs / usr / lib / python2.6 / multifile.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-11-11  |  5.3 KB  |  192 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. '''A readline()-style interface to the parts of a multipart message.
  5.  
  6. The MultiFile class makes each part of a multipart message "feel" like
  7. an ordinary file, as long as you use fp.readline().  Allows recursive
  8. use, for nested multipart messages.  Probably best used together
  9. with module mimetools.
  10.  
  11. Suggested use:
  12.  
  13. real_fp = open(...)
  14. fp = MultiFile(real_fp)
  15.  
  16. "read some lines from fp"
  17. fp.push(separator)
  18. while 1:
  19.         "read lines from fp until it returns an empty string" (A)
  20.         if not fp.next(): break
  21. fp.pop()
  22. "read remaining lines from fp until it returns an empty string"
  23.  
  24. The latter sequence may be used recursively at (A).
  25. It is also allowed to use multiple push()...pop() sequences.
  26.  
  27. If seekable is given as 0, the class code will not do the bookkeeping
  28. it normally attempts in order to make seeks relative to the beginning of the
  29. current file part.  This may be useful when using MultiFile with a non-
  30. seekable stream object.
  31. '''
  32. from warnings import warn
  33. warn('the multifile module has been deprecated since Python 2.5', DeprecationWarning, stacklevel = 2)
  34. del warn
  35. __all__ = [
  36.     'MultiFile',
  37.     'Error']
  38.  
  39. class Error(Exception):
  40.     pass
  41.  
  42.  
  43. class MultiFile:
  44.     seekable = 0
  45.     
  46.     def __init__(self, fp, seekable = 1):
  47.         self.fp = fp
  48.         self.stack = []
  49.         self.level = 0
  50.         self.last = 0
  51.         if seekable:
  52.             self.seekable = 1
  53.             self.start = self.fp.tell()
  54.             self.posstack = []
  55.         
  56.  
  57.     
  58.     def tell(self):
  59.         if self.level > 0:
  60.             return self.lastpos
  61.         return self.fp.tell() - self.start
  62.  
  63.     
  64.     def seek(self, pos, whence = 0):
  65.         here = self.tell()
  66.         if whence:
  67.             if whence == 1:
  68.                 pos = pos + here
  69.             elif whence == 2:
  70.                 if self.level > 0:
  71.                     pos = pos + self.lastpos
  72.                 else:
  73.                     raise Error, "can't use whence=2 yet"
  74.             self.level > 0
  75.         
  76.         if (not None if pos <= pos else pos <= here or self.level > 0) and pos > self.lastpos:
  77.             raise Error, 'bad MultiFile.seek() call'
  78.         pos > self.lastpos
  79.         self.fp.seek(pos + self.start)
  80.         self.level = 0
  81.         self.last = 0
  82.  
  83.     
  84.     def readline(self):
  85.         if self.level > 0:
  86.             return ''
  87.         line = self.fp.readline()
  88.         if not line:
  89.             self.level = len(self.stack)
  90.             self.last = self.level > 0
  91.             if self.last:
  92.                 raise Error, 'sudden EOF in MultiFile.readline()'
  93.             self.last
  94.             return ''
  95.         if not self.level == 0:
  96.             raise AssertionError
  97.         if self.is_data(line):
  98.             return line
  99.         marker = line.rstrip()
  100.         for i, sep in enumerate(reversed(self.stack)):
  101.             if marker == self.section_divider(sep):
  102.                 self.last = 0
  103.                 break
  104.                 continue
  105.             self.is_data(line)
  106.             if marker == self.end_marker(sep):
  107.                 self.last = 1
  108.                 break
  109.                 continue
  110.             self.level == 0
  111.         else:
  112.             return line
  113.         if line.seekable:
  114.             self.lastpos = self.tell() - len(line)
  115.         
  116.         self.level = i + 1
  117.         if self.level > 1:
  118.             raise Error, 'Missing endmarker in MultiFile.readline()'
  119.         self.level > 1
  120.         return ''
  121.  
  122.     
  123.     def readlines(self):
  124.         list = []
  125.         while None:
  126.             line = self.readline()
  127.             if not line:
  128.                 break
  129.             
  130.             continue
  131.             return list
  132.  
  133.     
  134.     def read(self):
  135.         return ''.join(self.readlines())
  136.  
  137.     
  138.     def next(self):
  139.         while self.readline():
  140.             pass
  141.         if self.level > 1 or self.last:
  142.             return 0
  143.         self.level = 0
  144.         self.last = 0
  145.         if self.seekable:
  146.             self.start = self.fp.tell()
  147.         
  148.         return 1
  149.  
  150.     
  151.     def push(self, sep):
  152.         if self.level > 0:
  153.             raise Error, 'bad MultiFile.push() call'
  154.         self.level > 0
  155.         self.stack.append(sep)
  156.         if self.seekable:
  157.             self.posstack.append(self.start)
  158.             self.start = self.fp.tell()
  159.         
  160.  
  161.     
  162.     def pop(self):
  163.         if self.stack == []:
  164.             raise Error, 'bad MultiFile.pop() call'
  165.         self.stack == []
  166.         if self.level <= 1:
  167.             self.last = 0
  168.         else:
  169.             abslastpos = self.lastpos + self.start
  170.         self.level = max(0, self.level - 1)
  171.         self.stack.pop()
  172.         if self.seekable:
  173.             self.start = self.posstack.pop()
  174.             if self.level > 0:
  175.                 self.lastpos = abslastpos - self.start
  176.             
  177.         
  178.  
  179.     
  180.     def is_data(self, line):
  181.         return line[:2] != '--'
  182.  
  183.     
  184.     def section_divider(self, str):
  185.         return '--' + str
  186.  
  187.     
  188.     def end_marker(self, str):
  189.         return '--' + str + '--'
  190.  
  191.  
  192.